# -*- coding: utf-8 -*-
"""
@Time    : 2024/8/2 10:50 
@Author  : ZhangShenao 
@File    : 1.基于Cookie实现登录.py 
@Desc    : 基于Cookie实现登录

Cookie的基本原理:
1. 服务端生成一段可以标识用户身份的文本串,通过Response Header,发送给客户端浏览器
2. 客户端浏览器将Cookie以key-value的形式,保存在本地
3. 下次再请求同一个域名时,客户端浏览器会自动携带上保存好的Cookie,放在Request Header中,发送给服务端
4. 服务端接收Cookie,根据Cookie中的内容,判断用户的身份和状态
5. Cookie有存储有效期,过期后,客户端浏览器会将Cookie会自动失效,不再发送给服务端

Cookie是存储在浏览器的纯文本信息,因此,Cookie不能保存敏感信息,如密码等

Cookie是基于域名隔离的,不同域名下的Cookie无法互通

由于Cookie自身的安全风险,目前Cookie技术已经逐渐被废弃了,在客户端通常采用Token机制来实现身份认证和状态管理
"""
import time

from flask import Flask, Response, request, url_for

app = Flask(__name__)
app.config["DEBUG"] = True


@app.route("/login", methods=["GET"])
def login() -> [str | Response]:
    """用户登录"""

    # 获取用户名和密码
    user_name = request.args.get("user_name")
    password = request.args.get("password")

    if user_name == "admin" and password == "123456":
        # 登录成功,设置Cookie,并跳转到首页
        location = url_for("index")
        response = Response("登录成功,正在跳转首页...", status=302, headers={"Location": location})
        response.set_cookie(key="user_name", value=user_name, max_age=300)  # Cookie过期时间5分钟
        response.set_cookie(key="user_id", value="123", max_age=300)
        time.sleep(1)
        return response
    else:
        return "用户名或密码错误"


@app.route("/index", methods=["GET"])
def index() -> str:
    """首页"""

    # 从Cookie中获取用户信息
    user_name = request.cookies.get("user_name")
    user_id = request.cookies.get("user_id")
    return f"<h1>欢迎回来,{user_name}({user_id})</h1>"


@app.route("/logout", methods=["GET"])
def logout() -> Response:
    """用户退出登录"""

    # 用户退出登录,需要清除Cookie
    # 由于Cookie是存储在客户端浏览器本地的,因此服务器无法直接操作清除
    # 服务端可以将Cookie的过期时间设置为0,这样浏览器会自动清除已经过期的Cookie
    response = Response("您已退出，请重新登录", status=200)
    response.set_cookie(key="user_name", value="", expires=0)
    response.set_cookie(key="user_id", value="", expires=0)

    time.sleep(1)
    return response


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
